home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
oh!.2hd
/
OH!DEN_B.LZH
/
TOOLS
/
KEYWITCH
/
KW_S200.LZH
/
w22env.s
< prev
next >
Wrap
Text File
|
1995-03-20
|
55KB
|
2,089 lines
.include w01dos.mac
.include w04macro.mac
.include w05reloc.mac
.include w09mes.mac
.text
.even
********************************
*テーブルのワークを初期化する
* スーパーバイザモードで呼び出すこと。
*<a4.l:常駐していて-rが指定されていない=常駐部分のbase/その他=base
*<a6.l:base
*?d0/a0-a1
init_table_work::
move.l a5,-(sp)
lea.l (table_list)r,a1
move.l (a1)+,d0
init_table_work_loop::
movea.l d0,a5
move.w (a1)+,d0
movea.l (a4,d0.w),a0
bsr move_table
move.l (a1)+,d0
bne init_table_work_loop
*
movea.l prog_table-base(a4),a0
lea.l (prog_table_work)r,a5
bsr move_prog_table
*
move.l ask_flag_bits-base(a4),(ask_flag_bits_work)r
*
lea.l live_repeat_bits-base(a4),a0
lea.l (live_repeat_bits_work)r,a5
.rept 16/4
move.l (a0)+,(a5)+
.endm
*
lea.l kill_repeat_bits-base(a4),a0
lea.l (kill_repeat_bits_work)r,a5
.rept 16/4
move.l (a0)+,(a5)+
.endm
*
lea.l led_map-base(a4),a0
lea.l (led_map_work)r,a5
moveq.l #7-1,d0
@@: move.b (a0)+,(a5)+
dbra d0,@b
*
lea.l joy1_map-base(a4),a0
lea.l (joy1_map_work)r,a5
moveq.l #8-1,d0
@@: move.b (a0)+,(a5)+
dbra d0,@b
*
lea.l joy2_map-base(a4),a0
lea.l (joy2_map_work)r,a5
moveq.l #8-1,d0
@@: move.b (a0)+,(a5)+
dbra d0,@b
*
movea.l (sp)+,a5
rts
********************************
*テーブルをワークから常駐部分に戻す
* スーパーバイザモードで呼び出すこと。
*<a5.l:常駐部分のbase
*<a6.l:base
*?d0-d1/a0-a2
renew_table_work::
*テーブルのサイズの合計を求める
lea.l (prog_table_work-22)r,a0
@@: lea.l 22(a0),a0
tst.w (a0)+
bne @b
lea.l (prog_table_work)r,a1
suba.l a1,a0
move.l a0,d1 *プログラム名のテーブルのサイズ
lea.l (table_list)r,a1
move.l (a1)+,d0
renew_table_work_1::
movea.l d0,a0
bsr get_table_size
add.l d0,d0
addq.l #2,d0 *エンドコードの分
add.l d0,d1
addq.w #2,a1
move.l (a1)+,d0
bne renew_table_work_1
di *割り込み禁止
*常駐部分に入り切るかどうか確認する
*<d1.l:テーブルのサイズの合計
lea.l (keep_tail)rr,a1 *常駐データの先頭
tst.b (device_flag)rr
beq renew_table_work_2 *デバイスドライバではない
lea.l (a1,d1.l),a0
move.l (device_end)rr,a2 *デバイスの末尾
cmpa.l a2,a0
bhi renew_table_work_3 *入り切らない
bra renew_table_work_5 *入り切る
*必要な大きさに変更する
renew_table_work_2::
move.l d1,d0
add.l #keep_tail-(prog_head-$F0),d0
move.l d0,-(sp)
pea.l (prog_head-$F0)rr
DOS _SETBLOCK
addq.w #8,sp
tst.l d0
bpl renew_table_work_5 *入り切る
*ぎりぎりまで縮小する
move.l #keep_tail-(prog_head-$F0),-(sp)
pea.l (prog_head-$F0)rr
DOS _SETBLOCK
addq.w #8,sp
*別の領域を確保する
renew_table_work_3::
move.l (alloc_point)rr,d0
beq renew_table_work_4 *アロケートされていない
move.l d0,-(sp) *アロケートされていた領域を開放
DOS _MFREE
addq.w #4,sp
renew_table_work_4::
lea.l (prog_head-$100)r,a0
move.l a0,d0
@@: movea.l d0,a0
move.l 4(a0),d0 *Humanのメモリ管理ポインタを探す
bne @b
pea.l 16(a0)
DOS _VERNUM
cmp.w #$0300,d0
bcc 1f
DOS _SETPDB~0
bra 2f
1: DOS _SETPDB *プロセス管理を移す
2: move.l d1,-(sp) *必要なメモリを確保
DOS _MALLOC
move.l d0,(alloc_point)rr
movea.l d0,a1
pea.l (prog_head-$F0)r
DOS _VERNUM
cmp.w #$0300,d0
bcc 1f
DOS _SETPDB~0
bra 2f
1: DOS _SETPDB *プロセス管理を元に戻す
2: lea.l 12(sp),sp
bra renew_table_work_6
renew_table_work_5::
move.l (alloc_point)rr,d0
beq renew_table_work_6 *アロケートされていない
move.l d0,-(sp) *アロケートされていた領域を開放
DOS _MFREE
addq.w #4,sp
clr.l (alloc_point)rr
*<a1.l:データを書き込む領域
renew_table_work_6::
movem.l a4/a5,-(sp)
movea.l a5,a4
movea.l a1,a5
lea.l (prog_table_work)r,a0
bsr move_prog_table
lea.l (table_list)r,a1
move.l (a1)+,d0
renew_table_work_loop::
movea.l d0,a0
move.w (a1)+,d0
move.l a5,(a4,d0.w)
bsr move_table
move.l (a1)+,d0
bne renew_table_work_loop
bsr trans_tables2
movem.l (sp)+,a4/a5
ei *割り込み許可
rts
********************************
*環境定義ファイルを読み込む
*<a2.l:環境定義ファイル名の並びの先頭(ヌルならばデフォルトが使用される)
*<a4.l:常駐していて-rが指定されていない=常駐部分のbase/その他=base
*<a6.l:base
*>d4.l:エラーなし=0/あり=メッセージの番号
*z:エラーあり=0/なし=1
*?d0-d7/a0-a5
load_environment::
*ワークエリアの初期設定
moveq.l #0,d0
lea.l (name_work)r,a0 *キーネームは複数のファイルにまたがる
move.b d0,(a0)
move.l a0,(last_name_tail)r *キーネームの並びの末尾
*ファイルの読み込み
load_file_loop::
*&ruleと&targetは複数のファイルをまたがない
moveq.l #0,d0
move.b d0,(rule_set)r *&ruleを設定したか
move.w d0,(target_count)r *&targetの長さ
*環境定義ファイル名をワークにコピーする
lea.l (env_name_work)r,a3 *環境定義ファイル名のワーク
movea.l a3,a0
tst.b (a2)
bne load_name_2 *環境定義ファイル名が指定されている
lea.l (exec_directory)r,a1 *起動ディレクトリ
lea.l (default_env_name)r,a2 *デフォルトの環境定義ファイル名
load_name_1::
move.b (a1)+,(a0)+
bne load_name_1
subq.w #1,a0
load_name_2::
move.b (a2)+,(a0)+
bne load_name_2
*環境定義ファイル名のアドレスを保存する
*<a2.l:次の環境定義ファイル名
move.l a2,(next_name_ptr)r
*環境定義ファイルをオープンする
*<a3.l:環境定義ファイル名のワーク
lea.l (env_var_name)r,a1 *環境変数名
lea.l (rdc_work)r,a5 *ファイル読み込みバッファの先頭
bsr open_file
bmi load_opn_err *オープンできない
*読み込み前の初期設定
moveq.l #0,d5 *エラーカウンタ
moveq.l #1,d6 *行番号
lea.l (rds_work)r,a4 *1行読み込みワークの先頭
* lea.l (rdc_work)r,a5 *ファイル読み込みバッファの先頭
*読み込みループ
*<d5.l:下位ワード=エラーカウンタ,ファイルエンドならば最上位ビット=1
*<d6.w:行番号
*<a3.l:アクセス中の環境定義ファイル名
*<a4.l:1行読み込みワークの先頭
*<a5.l:ファイル読み込みバッファの先頭
load_line_loop::
tst.l d5
bmi load_eof *ファイルエンド
bsr rds *1行読み込む
beq load_line_not_eof
bset.l #31,d5 *ファイルエンド
load_line_not_eof::
tst.b (a4)
beq load_line_loop *空行や注釈行
movea.l a4,a0 *1ワード目
moveq.l #M_UNKNOWN_COMMAND,d4
lea.l (load_coms)r,a1 *コマンドリスト
bsr word_search *コマンド検索
bmi load_line_err *未定義のコマンド
move.w load_jtbl(pc,d0.w),d0 *d0は偶数
jmp load_jtbl(pc,d0.w) *各コマンドの処理に分岐
load_jtbl::
.dc.w load_com_name-load_jtbl
.dc.w load_com_prog-load_jtbl
.dc.w load_com_rule-load_jtbl
.dc.w load_com_target-load_jtbl
.dc.w load_com_char-load_jtbl
.dc.w load_com_assign-load_jtbl
.dc.w load_com_code-load_jtbl
.dc.w load_com_prefix-load_jtbl
.dc.w load_com_suffix-load_jtbl
.dc.w load_com_ask-load_jtbl
.dc.w load_com_break-load_jtbl
.dc.w load_com_click-load_jtbl
.dc.w load_com_copy-load_jtbl
.dc.w load_com_den-load_jtbl
.dc.w load_com_full-load_jtbl
.dc.w load_com_hide-load_jtbl
.dc.w load_com_int-load_jtbl
.dc.w load_com_joy1-load_jtbl
.dc.w load_com_joy2-load_jtbl
.dc.w load_com_led-load_jtbl
.dc.w load_com_lock-load_jtbl
.dc.w load_com_meta-load_jtbl
.dc.w load_com_repeat-load_jtbl
.dc.w load_com_reset-load_jtbl
.dc.w load_com_sbreak-load_jtbl
.dc.w load_com_stop-load_jtbl
.dc.w load_com_unlock-load_jtbl
********************************
*環境定義ファイルのコマンドリスト
load_coms::
NameNumber = 0
.dc.b 5,'&name',NameNumber
NameNumber = NameNumber+2
.dc.b 5,'&prog',NameNumber
NameNumber = NameNumber+2
.dc.b 5,'&rule',NameNumber
NameNumber = NameNumber+2
.dc.b 7,'&target',NameNumber
NameNumber = NameNumber+2
.dc.b 5,'&char',NameNumber
NameNumber = NameNumber+2
.dc.b 7,'&assign',NameNumber
NameNumber = NameNumber+2
.dc.b 5,'&code',NameNumber
NameNumber = NameNumber+2
.dc.b 7,'&prefix',NameNumber
NameNumber = NameNumber+2
.dc.b 7,'&suffix',NameNumber
NameNumber = NameNumber+2
.dc.b 4,'&ask',NameNumber
NameNumber = NameNumber+2
.dc.b 6,'&break',NameNumber
NameNumber = NameNumber+2
.dc.b 6,'&click',NameNumber
NameNumber = NameNumber+2
.dc.b 5,'©',NameNumber
NameNumber = NameNumber+2
.dc.b 4,'&den',NameNumber
NameNumber = NameNumber+2
.dc.b 5,'&full',NameNumber
NameNumber = NameNumber+2
.dc.b 5,'&hide',NameNumber
NameNumber = NameNumber+2
.dc.b 4,'&int',NameNumber
NameNumber = NameNumber+2
.dc.b 5,'&joy1',NameNumber
NameNumber = NameNumber+2
.dc.b 5,'&joy2',NameNumber
NameNumber = NameNumber+2
.dc.b 4,'&led',NameNumber
NameNumber = NameNumber+2
.dc.b 5,'&lock',NameNumber
NameNumber = NameNumber+2
.dc.b 5,'&meta',NameNumber
NameNumber = NameNumber+2
.dc.b 7,'&repeat',NameNumber
NameNumber = NameNumber+2
.dc.b 6,'&reset',NameNumber
NameNumber = NameNumber+2
.dc.b 7,'&sbreak',NameNumber
NameNumber = NameNumber+2
.dc.b 5,'&stop',NameNumber
NameNumber = NameNumber+2
.dc.b 7,'&unlock',NameNumber
.dc.b 0
.even
********************************
*&break ルール
*<a0.l:2ワード目
load_com_break::
moveq.l #M_TOO_MANY_BREAK,d3
lea.l break_table_work,a1 *テーブルのワーク
lea.l break_table_work_end-break_table_work(a1),a2
bra load_event
********************************
*© ルール
*<a0.l:2ワード目
load_com_copy::
moveq.l #M_TOO_MANY_COPY,d3
lea.l copy_table_work,a1 *テーブルのワーク
lea.l copy_table_work_end-copy_table_work(a1),a2
bra load_event
********************************
*&den ルール
*<a0.l:2ワード目
load_com_den::
moveq.l #M_TOO_MANY_DEN,d3
lea.l den_table_work,a1 *テーブルのワーク
lea.l den_table_work_end-den_table_work(a1),a2
bra load_event
********************************
*&int ルール
*<a0.l:2ワード目
load_com_int::
moveq.l #M_TOO_MANY_INT,d3
lea.l int_table_work,a1 *テーブルのワーク
lea.l int_table_work_end-int_table_work(a1),a2
bra load_event
********************************
*&lock ルール
*<a0.l:2ワード目
load_com_lock::
moveq.l #M_TOO_MANY_LOCK,d3
lea.l lock_table_work,a1 *テーブルのワーク
lea.l lock_table_work_end-lock_table_work(a1),a2
bra load_event
********************************
*&reset ルール
*<a0.l:2ワード目
load_com_reset::
moveq.l #M_TOO_MANY_RESET,d3
lea.l reset_table_work,a1 *テーブルのワーク
lea.l reset_table_work_end-reset_table_work(a1),a2
bra load_event
********************************
*&sbreak ルール
*<a0.l:2ワード目
load_com_sbreak::
moveq.l #M_TOO_MANY_SBREAK,d3
lea.l sbreak_table_work,a1 *テーブルのワーク
lea.l sbreak_table_work_end-sbreak_table_work(a1),a2
bra load_event
********************************
*&unlock ルール
*<a0.l:2ワード目
load_com_unlock::
moveq.l #M_TOO_MANY_UNLOCK,d3
lea.l unlock_table_work,a1 *テーブルのワーク
lea.l unlock_table_work_end-unlock_table_work(a1),a2
* bra load_event
********************************
*イベントのルールの設定
*<d3.l:テーブルが溢れた場合のエラーコード
*<a0.l:2ワード目
*<a1.l:テーブルのワーク
*<a2.l:テーブルのワークの末尾
load_event::
moveq.l #M_MISSING_PARAMETER,d4
tst.b (a0)
beq load_line_err *ルールが指定されていない
move.l a1,d1
lea.l (rule_temp)r,a1 *ルールのビット展開領域
bsr load_rule *ルールを読み取る
bmi load_line_err
movea.l d1,a0 *テーブルのワーク
bsr rule_prog_search *プログラムの条件が同じテーブルを探す
beq load_event_set *同じテーブルがある
*新しいテーブルを作る
*<d1.l:テーブルのワーク
*<d3.l:テーブルが溢れた場合のエラーコード
*<a2.l:テーブルのワークの末尾
movea.l d1,a0 *テーブルのワーク
moveq.l #0,d1
bsr shift_forward *テーブルを後ろにずらす
bmi load_line_err
lea.l (rule_temp)r,a1
*ルールを書き込む
*<a0.l:テーブルのワーク
*<a1.l:ルール
load_event_set::
clr.w (a0)+ *定数
moveq.l #44/4-1,d0
load_event_set_loop::
move.l (a1)+,(a0)+ *ルールを書き込む
dbra d0,load_event_set_loop
bra load_line_loop
********************************
*テーブルを後ろにずらす
*<d1.w:挿入するテーブルのデータ部分のサイズ
*<d3.l:テーブルが溢れた場合のエラーコード
*<a0.l:テーブルのワーク
*<a2.l:テーブルのワークの上限
*>a0.l:エラーなし=テーブルのワーク/エラーあり=不定
*>d4.l:エラーなし=0/エラーあり=エラーコード
*>n:エラーなし=0/エラーあり=1
*?d0/d4/a0-a1
shift_forward::
bsr get_table_size
add.w d0,d0
lea.l 2(a0,d0.w),a0 *シフト前のエンドコードの次のアドレス
lea.l 2+44(a0,d1.w),a1 *シフト後のエンドコードの次のアドレス
cmpa.l a2,a1
bhi shift_forward_over *テーブルが溢れた
lsr.w #1,d0
shift_forward_shift::
move.w -(a0),-(a1) *テーブルを後ろにずらす
dbra d0,shift_forward_shift
moveq.l #0,d4
rts
shift_forward_over::
move.l d3,d4 *エラーコード
rts
********************************
*&rule ルール
*<a0.l:2ワード目
load_com_rule::
lea.l (rule_work)r,a1
bsr load_rule *ルールを読み取る
bmi load_line_err
st.b (rule_set)r *&ruleが設定された
bra load_line_loop
********************************
*&name キーコード キーネーム
*<a0.l:2ワード目
load_com_name::
moveq.l #M_ILLEGAL_KEY_CODE,d4
cmpi.b #2,(a0)+ *長さ
bne load_line_err
bsr chrhex2 *16進数2桁をバイナリに変換
bmi load_line_err
move.w d0,d1 *キーコード
move.l a0,d2 *キーネーム
lea.l (name_work)r,a1
bsr word_search
moveq.l #M_TOO_MANY_PARAMETERS,d4
movea.l d2,a0
moveq.l #0,d3
move.b (a0)+,d3
tst.b (a0,d3.w)
bne load_line_err *キーネームの後に何かある
tst.l d0
bmi load_com_name_new *未定義のキーネーム
moveq.l #M_DUPLICATE_NAME,d4
cmp.b d0,d1
bne load_line_err *キーネームの二重定義
bra load_line_loop *同じコードでの二重定義は無視する
*<d1.w:キーコード
*<d2.l:キーネーム
load_com_name_new::
moveq.l #M_ILLEGAL_KEY_CODE,d4
cmp.b #$90,d1
bhs load_line_err *キーコードが範囲外
movea.l d2,a0 *キーネーム
moveq.l #0,d0
move.b (a0)+,d0 *キーネームの長さ
movea.l (last_name_tail)r,a1 *キーネームの並びの末尾
lea.l 1+1(a1,d0.w),a2 *書き込み後のキーネームの並びの末尾
moveq.l #M_TOO_MANY_NAMES,d4
cmpa.l #name_work_tail,a2
bhs load_line_err *キーネームのワークが溢れた
move.b d0,(a1)+
subq.w #1,d0
load_com_name_copy::
move.b (a0)+,(a1)+ *キーネームをコピー
dbra d0,load_com_name_copy
move.b d1,(a1)+ *キーコード
clr.b (a1) *エンドコード
move.l a1,(last_name_tail)r *キーネームの並びの末尾を更新
bra load_line_loop
********************************
*&joy1 キーネーム …
*<a0.l:2ワード目
load_com_joy1::
lea.l (joy1_map_work)r,a1
bra load_joy
********************************
*&joy2 キーネーム …
*<a0.l:2ワード目
load_com_joy2::
lea.l (joy2_map_work)r,a1
* bra load_joy
********************************
*ジョイスティックのキーの設定
* 標準で未使用のビットも含めて8データ設定します。
* 引数の省略はできません。
*<a0.l:2ワード目
*<a1.l:マップのアドレス
load_joy::
moveq.l #8-1,d1
load_joy_loop::
moveq.l #M_MISSING_PARAMETER,d4
tst.b (a0)
beq load_line_err *引数が足りない
moveq.l #M_UNDEFINED_NAME,d4
bsr name_search
bmi load_line_err *キーネームが違う
move.b d0,(a1)+
dbra d1,load_joy_loop
moveq.l #M_TOO_MANY_PARAMETERS,d4
tst.b (a0)
bne load_line_err *引数が多すぎる
bra load_line_loop
********************************
*&led キーネーム …
* 1つ目のキーネームのキーのLEDを2つ目以降のキーのLEDに反映させます。
*<a0.l:2ワード目
load_com_led::
moveq.l #7,d3
moveq.l #M_MISSING_PARAMETER,d4
tst.b (a0)
beq load_line_err *引数が足りない
bsr name_to_led *キーネームをLEDの番号に変換する
bmi load_line_err
move.l d0,d1
moveq.l #-1,d2 *反映させるLEDのビットが0になる
lea.l (led_map_work)r,a1
bra load_com_led_cont
load_com_led_loop::
bsr name_to_led *キーネームをLEDの番号に変換する
bmi load_line_err
moveq.l #M_DUPLICATE_PARAMETER,d4
bclr.l d0,d2 *反映させるLEDのビットをクリア
beq load_line_err *既にクリアされていた
load_com_led_cont::
tst.b (a0)
bne load_com_led_loop *引数が多すぎる
move.b d2,(a1,d1.w) *マップに設定する
bra load_line_loop
********************************
*キーネームをLEDの番号に変換する
*<d3.w:7
*<a0.l:ワード
*>d0.w:エラーなし=LEDの番号/エラーあり=不定
*>d4.l:エラーなし=0/エラーあり=エラーコード
*>a0.l:エラーなし=次のワード/エラーあり=不定
*>n:エラーなし=0/エラーあり=1
*?d0/d4/a0
name_to_led::
moveq.l #M_UNDEFINED_NAME,d4
bsr name_search
bmi name_to_led_err
moveq.l #M_ILLEGAL_KEY_CODE,d4
sub.w #$80+7,d0
addq.w #7,d0
bcs name_to_led_end
sub.w #$5A+7-$80,d0
addq.w #7,d0
bcc name_to_led_err
name_to_led_end::
moveq.l #0,d4
name_to_led_err::
tst.l d4
rts
********************************
*&target キーネーム …
*<a0.l:2ワード目
load_com_target::
load_target::
moveq.l #M_MISSING_PARAMETER,d4
tst.b (a0)
beq load_line_err *引数が足りない
lea.l (target_mark)r,a2 *二重定義チェックのためのワーク
moveq.l #0,d0
moveq.l #128/4-1,d1
load_target_clr::
move.l d0,(a2)+
dbra d1,load_target_clr
lea.l (target_mark)r,a2
lea.l (target_work)r,a1 *&targetのワーク
st.b (target_min)r *キーコードの最小値
sf.b (target_max)r *キーコードの最大値
moveq.l #128-1,d1
load_target_loop::
moveq.l #M_UNDEFINED_NAME,d4
bsr name_search *キーコードを得る
bmi load_line_err
bsr code_to_scan *キーコードをスキャンコードに変換
bmi load_line_err
moveq.l #M_DUPLICATE_PARAMETER,d4
tas.b (a2,d0.w)
bne load_line_err *同じコードが2回現れた
move.b d0,(a1)+ *スキャンコードを設定
cmp.b (target_min)r,d0
bhs load_target_not_min
move.b d0,(target_min)r *最小値を更新する
load_target_not_min::
cmp.b (target_max)r,d0
bls load_target_not_max
move.b d0,(target_max)r *最大値を更新する
load_target_not_max::
move.b (a0),d0
dbeq d1,load_target_loop *まだ引数があればループ
moveq.l #M_TOO_MANY_PARAMETERS,d4
move.w #128,d0
sub.w d1,d0 *引数の個数
bcs load_line_err *引数が多すぎる
move.w d0,(target_count)r *引数の個数
bra load_line_loop
********************************
*&repeat {0|1} …
load_com_repeat::
lea.l (live_repeat_bits_work)r,a2
bra load_repeat
********************************
*&stop {0|1} …
load_com_stop::
lea.l (kill_repeat_bits_work)r,a2
* bra load_repeat
********************************
*リピート関係のマップの定義
*<a0.l:2ワード目
*<a2.l:ワークのアドレス
load_repeat::
moveq.l #M_TARGET_NOT_BINDED,d4
move.w (target_count)r,d1 *設定するデータ数
beq load_line_err *&targetが設定されていない
lea.l (target_work)r,a1
moveq.l #0,d2
subq.w #1,d1
load_repeat_loop::
move.b (a1)+,d2 *キーコード
move.w d2,d3
lsr.w #3,d3
moveq.l #M_MISSING_PARAMETER,d4
move.b (a0)+,d0
beq load_line_err *引数が足りない
moveq.l #M_ILLEGAL_PARAMETER,d4
subq.b #1,d0
bne load_line_err *引数が違う
moveq.l #-'1',d0
add.b (a0)+,d0
beq load_repeat_one
addq.b #'1'-'0',d0
bne load_line_err *引数が違う
bclr.b d2,(a2,d3.w) *0を設定
bra load_repeat_next
load_repeat_one::
bset.b d2,(a2,d3.w)
load_repeat_next::
dbra d1,load_repeat_loop
moveq.l #M_TOO_MANY_PARAMETERS,d4
tst.b (a0)
bne load_line_err *引数が多すぎる
bra load_line_loop
********************************
*新しいコード変換テーブルを作る
*<d1.b:スキャンコードの最小値
*<d2.b:スキャンコードの最大値
*<d3.w:1データのサイズの最大値
*<a0.l:テーブルの先頭
*<a1.l:ルールの先頭
*?d0-d2/a0-a2
make_xtbl::
addq.w #2,a0
.rept 44/4
move.l (a1)+,(a0)+ *ルール
.endm
movea.l a0,a2
move.b d1,(a2)+ *最初のデータのスキャンコード
addq.b #1,d2
sub.b d1,d2 *データ数
move.b d2,(a2)+ *データ数
move.b d3,(a2)+ *1データのサイズの最大値
moveq.l #0,d1
move.b d2,d1
subq.w #1,d1 *データ数-1
moveq.l #0,d2
move.b d3,d2
subq.w #2,d2 *1データのサイズの最大値-2
make_xtbl_loop::
move.b #$FE,(a2)+ *先頭は$FE
move.w d2,d0
bmi make_xtbl_next *サイズが1バイト
make_xtbl_rest::
st.b (a2)+ *残りは$FFで充填する
dbra d0,make_xtbl_rest
make_xtbl_next::
dbra d1,make_xtbl_loop
sf.b (a2)+
move.w a2,d0
sub.w a0,d0 *データ部分のサイズ+1
and.w #$FFFE,d0 *偶数に切り上げ
move.w d0,-2-44(a0) *データサイズを設定
rts
********************************
*コード変換テーブルを拡張しながらコピーする
* スキャンコードの符号は一致していること。
*<d1.b:スキャンコードの最小値
*<d2.b:スキャンコードの最大値
*<d3.w:1データのサイズの最大値
*<a0.l:コピー先のテーブルの先頭
*<a1.l:コピー元のテーブルの先頭
*?d0-d1/a0/a2
copy_xtbl::
movem.l d4-d7/a1,-(sp)
addq.w #2,a0
addq.w #2,a1
.rept 44/4
move.l (a1)+,(a0)+ *ルール
.endm
movea.l a0,a2 *コピー先のルールの直後
moveq.l #0,d4
move.b (a1)+,d4 *元の最初のデータのスキャンコード
move.b d4,(a2)+
moveq.l #0,d5
move.b (a1)+,d5 *元のデータ数
move.b d5,(a2)+
moveq.l #0,d6
move.b (a1)+,d6 *元の1データのサイズの最大値
moveq.l #0,d7 *1データのサイズの増分
cmp.b d6,d3
bls copy_xtbl_not_longer *増分なし
move.w d3,d7
sub.w d6,d7 *1データのサイズの増分
copy_xtbl_not_longer::
add.w d7,d6 *新しい1データのサイズの最大値
move.b d6,(a2)+
*<d1.b:スキャンコードの最小値
*<d2.b:スキャンコードの最大値
*<d3.b:1データのサイズの最大値
*<d4.l:元の最初のデータのスキャンコード
*<d5.l:元のデータ数
*<d6.l:新しい1データのサイズの最大値
*<d7.l:1データのサイズの最大値の増分
*<a0.l:コピー元のルールの直後
*<a1.l:コピー元の最初のデータの位置
*<a2.l:コピー先の最初のデータの位置
cmp.b d4,d1
bhs copy_xtbl_top_ok *最初のデータのスキャンコードは小さくならない
move.b d1,(a0) *新しい最初のスキャンコード
move.w d4,d1 *元の最初のデータのスキャンコード
sub.b (a0),d1 *最初のデータのスキャンコードの減分
add.b d1,1(a0) *データ数を増やす
subq.w #1,d1 *最初のデータのスキャンコードの減分-1
subq.w #2,d6 *新しい1データのサイズの最大値-2
copy_xtbl_top_loop::
move.b #$FE,(a2)+ *先頭は$FE
move.w d6,d0
bmi copy_xtbl_top_next *サイズが1バイト
copy_xtbl_top_rest::
st.b (a2)+ *残りは$FFで充填する
dbra d0,copy_xtbl_top_rest
copy_xtbl_top_next::
dbra d1,copy_xtbl_top_loop
addq.w #2,d6 *新しい1データのサイズの最大値
copy_xtbl_top_ok::
sub.w d7,d6 *元の1データのサイズの最大値
add.w d5,d4
subq.w #1,d4 *元の最後のデータのスキャンコード
subq.w #1,d5 *元のデータ数-1
subq.w #1,d6 *元の1データのサイズの最大値-1
subq.w #1,d7 *1データのサイズの最大値の増分-1
copy_xtbl_loop::
move.w d6,d0 *元の1データのサイズの最大値-1
copy_xtbl_copy::
move.b (a1)+,(a2)+ *元のデータをコピー
dbra d0,copy_xtbl_copy
move.w d7,d0 *1データのサイズの最大値の増分-1
bmi copy_xtbl_copy_next *増分なし
copy_xtbl_copy_rest::
st.b (a2)+ *残りは$FFで充填する
dbra d0,copy_xtbl_copy_rest
copy_xtbl_copy_next::
dbra d5,copy_xtbl_loop
cmp.b d4,d2
bls copy_xtbl_btm_ok *最後のデータのスキャンコードは大きくならない
moveq.l #0,d1
move.b d2,d1 *スキャンコードの最大値
sub.w d4,d1 *最後のデータのスキャンコードの増分
add.b d1,1(a0) *データ数を増やす
subq.w #1,d1 *最後のデータのスキャンコードの増分-1
add.b d7,d6 *新しい1データのサイズの最大値-2
copy_xtbl_btm_loop::
move.b #$FE,(a2)+ *先頭は$FE
move.w d6,d0
bmi copy_xtbl_btm_next *サイズが1バイト
copy_xtbl_btm_rest::
st.b (a2)+ *残りは$FFで充填する
dbra d0,copy_xtbl_btm_rest
copy_xtbl_btm_next::
dbra d1,copy_xtbl_btm_loop
copy_xtbl_btm_ok::
sf.b (a2)+
move.w a2,d0
sub.w a0,d0 *データ部分のサイズ+1
and.w #$FFFE,d0 *偶数に切り上げ
move.w d0,-2-44(a0) *データサイズを設定
movem.l (sp)+,d4-d7/a1
rts
********************************
*テーブルを削除する
*<a1.l:削除するテーブルの先頭
*?d0/a0-a1
erase_table::
move.w (a1),d0
lea.l 2+44(a1,d0.w),a0
bsr get_table_size *元のテーブルの後ろのサイズ
erase_table_loop::
move.w (a0)+,(a1)+ *後ろの部分を詰める
dbra d0,erase_table_loop
rts
********************************
*テーブルをコピーする
*<a0.l:コピー先
*<a1.l:コピー元
*?d0/a0-a1
duplicate_table::
move.w (a1),d0
lsr.w #1,d0 *データ部分のワード数
add.w #(2+44)/2-1,d0 *ヘッダの部分を加えてから-1
duplicate_table_loop::
move.w (a1)+,(a0)+ *新しいテーブルを書き込む
dbra d0,duplicate_table_loop
rts
********************************
*&char 文字列 …
*<a0.l:2ワード目
load_com_char::
load_char::
moveq.l #M_RULE_NOT_BINDED,d4
tst.b (rule_set)r
beq load_line_err *&ruleが設定されていない
moveq.l #M_TARGET_NOT_BINDED,d4
move.w (target_count)r,d1 *設定するデータ数
beq load_line_err *&targetが設定されていない
subq.w #1,d1
*データ数と最大の長さを調べる
*<d1.w:&targetの引数の個数-1
*<a0.l:2ワード目
movea.l a0,a1 *2ワード目
moveq.l #0,d0 *長さ
moveq.l #0,d3 *最大長
moveq.l #M_MISSING_PARAMETER,d4
move.w d1,d2 *引数の個数-1
load_char_chk::
move.b (a1)+,d0 *長さ
beq load_line_err *引数が足りない
adda.w d0,a1
cmp.b d3,d0
bls load_char_chk_nxt
move.b d0,d3 *最大長を更新
load_char_chk_nxt::
dbra d2,load_char_chk
moveq.l #M_TOO_MANY_PARAMETERS,d4
tst.b (a1)
bne load_line_err *引数が多すぎる
moveq.l #M_TOO_LONG_CHARS,d4
cmp.b #32,d3
bhi load_line_err *長すぎる引数がある
*既に存在するテーブルのルールと一致するか確かめる
*<d1.w:&targetの引数の個数-1
*<d3.w:1データのサイズの最大値
*<a0.l:2ワード目
move.l a0,-(sp)
lea.l char_table_work,a1
bsr rule_search
lea.l -(2+44)(a1),a1
bne load_char_new *同じルールのテーブルは存在しない
*テーブルを作り直す
*<d3.w:1データのサイズの最大値
*<a1.l:元のテーブルの先頭
*<(sp).l:2ワード目
lea.l (char_table_temp)r,a0 *テーブルの先頭
move.b (target_min),d1 *スキャンコードの最小値
move.b (target_max),d2 *スキャンコードの最大値
bsr copy_xtbl *テーブルを拡張しながらコピーする
bsr erase_table *テーブルを削除する
moveq.l #0,d3
move.b (char_table_temp+2+44+2)r,d3 *新しい1データのサイズの最大値
*<d3.w:新しい1データのサイズの最大値
*<(sp).l:2ワード目
bra load_char_expand
*新しいテーブルを作る
*<d3.w:新しい1データのサイズの最大値
*<(sp).l:2ワード目
load_char_new::
lea.l (char_table_temp)r,a0 *テーブルの先頭
lea.l (rule_work)r,a1 *ルールの先頭
move.b (target_min),d1 *スキャンコードの最小値
move.b (target_max),d2 *スキャンコードの最大値
bsr make_xtbl *新しいコード変換テーブルを作る
*&charの引数をテーブルに書き込む
*<d3.w:新しい1データのサイズの最大値
*<(sp).l:2ワード目
load_char_expand::
movea.l (sp)+,a0 *2ワード目
move.l a3,-(sp) *ワークに使うため保護
lea.l (char_table_temp)r,a1 *テーブルの先頭
lea.l (target_work)r,a2 *&targetの引数の並び
move.w (target_count)r,d1 *&targetの引数の個数
subq.w #1,d1 *&targetの引数の個数-1
load_char_loop::
moveq.l #0,d0
move.b (a2)+,d0 *スキャンコード
sub.b 2+44(a1),d0 *何番目のデータか
cmp.w #1,d3
beq load_char_not_mul *1データが1バイト
mulu.w d3,d0
load_char_not_mul::
lea.l 2+44+3(a1,d0.w),a3 *書き込む位置
moveq.l #0,d0
move.b (a0)+,d0 *文字列の長さ
move.w d3,d2
sub.w d0,d2 *残りの長さ
subq.w #1,d0 *文字列の長さ-1
load_char_copy::
move.b (a0)+,(a3)+ *文字列をコピーする
dbra d0,load_char_copy
subq.w #1,d2 *残りの長さ-1
bcs load_char_not_rest
load_char_rest::
st.b (a3)+ *残りを$FFで充填する
dbra d2,load_char_rest
load_char_not_rest::
dbra d1,load_char_loop
movea.l (sp)+,a3 *ワークに使ったので復元
*新しいテーブルをテーブルの並びの先頭に追加する
move.w (char_table_temp)r,d1 *データ部分のサイズ
moveq.l #M_TOO_MANY_CHAR,d3
lea.l char_table_work,a0 *ワークの先頭
lea.l char_table_work_end-char_table_work(a0),a2 *ワークの上限
bsr shift_forward *テーブルを後ろにずらす
bmi load_line_err *テーブルの領域が溢れた
lea.l (char_table_temp)r,a1
bsr duplicate_table *先頭に書き込む
bra load_line_loop
********************************
*&assign {キーコード|キーネーム}{=0|[=1]} …
*<a0.l:2ワード目
load_com_assign::
load_assign::
moveq.l #M_RULE_NOT_BINDED,d4
tst.b (rule_set)r
beq load_line_err *&ruleが設定されていない
bsr assign_sub *引数を展開,結果はassign_tempへ
bmi load_line_err
subq.w #1,d3 *2番目以降の引数の個数(0でも可)
*既に存在するテーブルのルールと一致するか確かめる
*<d3.l:2番目以降の引数の個数
lea.l assign_table_work,a1
bra load_assign_search
load_assign_retry::
move.w (a1),d0
lea.l 2+44(a1,d0.w),a1 *次のテーブル
load_assign_search::
bsr rule_search
lea.l -2-44(a1),a1
bne load_assign_new *同じルールのテーブルは存在しない
moveq.l #0,d0
move.b (assign_temp)r,d0 *最初の引数のスキャンコード
move.b 2+44(a1),d1 *テーブルにあるスキャンコード
eor.b d0,d1
bmi load_assign_retry *スキャンコードの符号が違う
*テーブルを作り直す
*<d0.l:最初の引数
*<d3.l:2番目以降の引数の個数
*<a1.l:元のテーブルの先頭
lea.l (assign_table_temp)r,a0 *テーブルの先頭
move.l d0,d1 *スキャンコードの最小値
move.l d0,d2 *スキャンコードの最大値
bsr copy_xtbl *テーブルを拡張しながらコピーする
bsr erase_table *テーブルを削除する
*<d3.l:2番目以降の引数の個数
bra load_assign_expand
*新しいテーブルを作る
*<d3.l:2番目以降の引数の個数(0でも可)
load_assign_new::
lea.l (assign_table_temp)r,a0 *テーブルの先頭
lea.l (rule_work)r,a1 *ルールの先頭
moveq.l #0,d0
move.b (assign_temp)r,d0 *最初の引数のスキャンコード
move.l d0,d1 *スキャンコードの最小値
move.l d0,d2 *スキャンコードの最大値
move.w d3,-(sp)
bne load_assign_not_zero
addq.w #1,d3 *サイズが0のときは1に変更する
load_assign_not_zero::
bsr make_xtbl *新しいコード変換テーブルを作る
move.w (sp)+,d3
*引数をテーブルに書き込む
*<d3.l:2番目以降の引数の個数(0でも可)
load_assign_expand::
lea.l (assign_temp)r,a0 *引数の並び
lea.l (assign_table_temp)r,a1 *テーブルの先頭
moveq.l #0,d0
move.b (a0)+,d0 *最初の引数のスキャンコード
sub.b 2+44(a1),d0 *何番目のデータか
moveq.l #0,d1
move.b 2+44+2(a1),d1 *1データのサイズの最大値
cmp.w #1,d1
beq load_assign_not_mul *1データが1バイト
mulu.w d1,d0
load_assign_not_mul::
lea.l 2+44+3(a1,d0.w),a2 *書き込む位置
sub.w d3,d1 *残りのバイト数
subq.w #1,d3 *2番目以降の引数の個数-1
bcs load_assign_null *2番目以降の引数がない
load_assign_copy::
move.b (a0)+,(a2)+ *スキャンコード列をコピーする
dbra d3,load_assign_copy
load_assign_null::
subq.w #1,d1 *残りのバイト数-1
bcs load_assign_not_rest *1データが1バイト
load_assign_rest::
st.b (a2)+ *残りを$FFで充填する
dbra d0,load_assign_rest
load_assign_not_rest::
*新しいテーブルをテーブルの並びの先頭に追加する
move.w (assign_table_temp)r,d1 *データ部分のサイズ
moveq.l #M_TOO_MANY_ASSIGN,d3
lea.l assign_table_work,a0 *ワークの先頭
lea.l assign_table_work_end-assign_table_work(a0),a2 *ワークの上限
bsr shift_forward *テーブルを後ろにずらす
bmi load_line_err *テーブルの領域が溢れた
lea.l (assign_table_temp)r,a1
bsr duplicate_table *先頭に書き込む
bra load_line_loop
********************************
*&prefix {キーコード|キーネーム}{=0|[=1]} …
*<a0.l:2ワード目
load_com_prefix::
load_prefix::
moveq.l #M_RULE_NOT_BINDED,d4
tst.b (rule_set)r
beq load_line_err *&ruleが設定されていない
moveq.l #M_TARGET_NOT_BINDED,d4
tst.w (target_count)r
beq load_line_err *&targetが設定されていない
bsr assign_sub *引数を展開,結果はassign_tempへ
bmi load_line_err
*既に存在するテーブルのルールと一致するか確かめる
*<d3.l:引数の個数
lea.l prefix_table_work,a1
bsr rule_search
lea.l -2-44(a1),a1
bne load_prefix_new *同じルールのテーブルは存在しない
*テーブルを作り直す
*<d3.l:引数の個数
*<a1.l:元のテーブルの先頭
lea.l (prefix_table_temp)r,a0 *テーブルの先頭
move.b (target_min)r,d1 *スキャンコードの最小値
move.b (target_max)r,d2 *スキャンコードの最大値
bsr copy_xtbl *テーブルを拡張しながらコピーする
bsr erase_table *テーブルを削除する
*<d3.l:引数の個数
bra load_prefix_expand
*新しいテーブルを作る
*<d3.l:引数の個数
load_prefix_new::
lea.l (prefix_table_temp)r,a0 *テーブルの先頭
lea.l (rule_work)r,a1 *ルールの先頭
move.b (target_min)r,d1 *スキャンコードの最小値
move.b (target_max)r,d2 *スキャンコードの最大値
bsr make_xtbl *新しいコード変換テーブルを作る
*引数をテーブルに書き込む
*<d3.l:引数の個数
load_prefix_expand::
move.l a3,-(sp) *ワークに使うため保護
lea.l (prefix_table_temp)r,a1 *テーブルの先頭
lea.l (target_work)r,a2 *&targetの引数の並び
move.w (target_count)r,d1 *&targetの引数の個数
subq.w #1,d1 *&targetの引数の個数-1
load_prefix_loop::
moveq.l #0,d0
move.b (a2)+,d0 *スキャンコード
sub.b 2+44(a1),d0 *何番目のデータか
moveq.l #0,d2
move.b 2+44+2(a1),d2 *1データのサイズの最大値
cmp.w #1,d2
beq load_prefix_not_mul *1データが1バイト
mulu.w d2,d0
load_prefix_not_mul::
lea.l 2+44+3(a1,d0.w),a3 *書き込む位置
lea.l (assign_temp)r,a0 *&prefixの引数の並び
move.w d3,d0 *引数の個数
sub.w d0,d2 *残りの長さ
subq.w #1,d0 *引数の個数-1
load_prefix_copy::
move.b (a0)+,(a3)+ *スキャンコードをコピーする
dbra d0,load_prefix_copy
subq.w #1,d2 *残りの長さ-1
bcs load_prefix_not_rest
load_prefix_rest::
st.b (a3)+ *残りを$FFで充填する
dbra d2,load_prefix_rest
load_prefix_not_rest::
dbra d1,load_prefix_loop
movea.l (sp)+,a3 *ワークに使ったので復元
*新しいテーブルをテーブルの並びの先頭に追加する
move.w (prefix_table_temp)r,d1 *データ部分のサイズ
moveq.l #M_TOO_MANY_PREFIX,d3
lea.l prefix_table_work,a0 *ワークの先頭
lea.l prefix_table_work_end-prefix_table_work(a0),a2 *ワークの上限
bsr shift_forward *テーブルを後ろにずらす
bmi load_line_err *テーブルの領域が溢れた
lea.l (prefix_table_temp)r,a1
bsr duplicate_table *先頭に書き込む
bra load_line_loop
********************************
*&suffix {キーコード|キーネーム}{=0|[=1]} …
*<a0.l:2ワード目
load_com_suffix::
load_suffix::
moveq.l #M_RULE_NOT_BINDED,d4
tst.b (rule_set)r
beq load_line_err *&ruleが設定されていない
moveq.l #M_TARGET_NOT_BINDED,d4
tst.w (target_count)r
beq load_line_err *&targetが設定されていない
bsr assign_sub *引数を展開,結果はassign_tempへ
bmi load_line_err
*既に存在するテーブルのルールと一致するか確かめる
*<d3.l:引数の個数
lea.l suffix_table_work,a1
bsr rule_search
lea.l -2-44(a1),a1
bne load_suffix_new *同じルールのテーブルは存在しない
*テーブルを作り直す
*<d3.l:引数の個数
*<a1.l:元のテーブルの先頭
lea.l (suffix_table_temp)r,a0 *テーブルの先頭
move.b (target_min)r,d1 *スキャンコードの最小値
move.b (target_max)r,d2 *スキャンコードの最大値
bsr copy_xtbl *テーブルを拡張しながらコピーする
bsr erase_table *テーブルを削除する
*<d3.l:引数の個数
bra load_suffix_expand
*新しいテーブルを作る
*<d3.l:引数の個数
load_suffix_new::
lea.l (suffix_table_temp)r,a0 *テーブルの先頭
lea.l (rule_work)r,a1 *ルールの先頭
move.b (target_min)r,d1 *スキャンコードの最小値
move.b (target_max)r,d2 *スキャンコードの最大値
bsr make_xtbl *新しいコード変換テーブルを作る
*引数をテーブルに書き込む
*<d3.l:引数の個数
load_suffix_expand::
move.l a3,-(sp) *ワークに使うため保護
lea.l (suffix_table_temp)r,a1 *テーブルの先頭
lea.l (target_work)r,a2 *&targetの引数の並び
move.w (target_count)r,d1 *&targetの引数の個数
subq.w #1,d1 *&targetの引数の個数-1
load_suffix_loop::
moveq.l #0,d0
move.b (a2)+,d0 *スキャンコード
sub.b 2+44(a1),d0 *何番目のデータか
moveq.l #0,d2
move.b 2+44+2(a1),d2 *1データのサイズの最大値
cmp.w #1,d2
beq load_suffix_not_mul *1データが1バイト
mulu.w d2,d0
load_suffix_not_mul::
lea.l 2+44+3(a1,d0.w),a3 *書き込む位置
lea.l (assign_temp)r,a0 *&suffixの引数の並び
move.w d3,d0 *引数の個数
sub.w d0,d2 *残りの長さ
subq.w #1,d0 *引数の個数-1
load_suffix_copy::
move.b (a0)+,(a3)+ *スキャンコードをコピーする
dbra d0,load_suffix_copy
subq.w #1,d2 *残りの長さ-1
bcs load_suffix_not_rest
load_suffix_rest::
st.b (a3)+ *残りを$FFで充填する
dbra d2,load_suffix_rest
load_suffix_not_rest::
dbra d1,load_suffix_loop
movea.l (sp)+,a3 *ワークに使ったので復元
*新しいテーブルをテーブルの並びの先頭に追加する
move.w (suffix_table_temp)r,d1 *データ部分のサイズ
moveq.l #M_TOO_MANY_SUFFIX,d3
lea.l suffix_table_work,a0 *ワークの先頭
lea.l suffix_table_work_end-suffix_table_work(a0),a2 *ワークの上限
bsr shift_forward *テーブルを後ろにずらす
bmi load_line_err *テーブルの領域が溢れた
lea.l (suffix_table_temp)r,a1
bsr duplicate_table *先頭に書き込む
bra load_line_loop
********************************
*&assign,&prefix,&suffixの引数の読み取り
* 結果はassign_tempに残ります。
*<a0.l:2ワード目
*>d3.l:エラーなし=引数の個数/エラーあり=不定
*>d4.l:エラーなし=0/エラーあり=エラーコード
*>n:エラーなし=0/エラーあり=1
*?d0-d2/d4/a0-a2
assign_sub::
moveq.l #M_MISSING_PARAMETER,d4
moveq.l #0,d0
move.b (a0),d0 *長さ
beq assign_sub_err *引数が足りない
lea.l (assign_temp)r,a2
moveq.l #0,d3 *引数の個数
assign_sub_loop::
addq.w #1,d3
moveq.l #M_TOO_MANY_PARAMETERS,d4
cmp.w #32,d3
bhi assign_sub_err *引数が多すぎる
moveq.l #0,d1 *=1(デフォルト)
lea.l 1(a0,d0.w),a1 *次の引数の位置
cmpi.b #'=',-2(a1)
bne assign_sub_no_equal
cmpi.b #'1',-1(a1)
beq assign_sub_one *=1
cmpi.b #'0',-1(a1)
bne assign_sub_no_equal *{=0|=1}がない
moveq.l #$80,d1 *=0
assign_sub_one::
subq.b #2,(a0) *2文字短くする
assign_sub_no_equal::
moveq.l #M_UNDEFINED_NAME,d4
bsr name_search *キーコードを得る
bmi assign_sub_err
bsr code_to_scan *スキャンコードに変換する
bmi assign_sub_err
or.b d1,d0 *=0のとき$80を加える
move.b d0,(a2)+ *スキャンコードを記録する
movea.l a1,a0 *次の位置
moveq.l #0,d0
move.b (a0),d0
bne assign_sub_loop *まだ引数がある
moveq.l #0,d4
assign_sub_err::
tst.l d4
rts
********************************
*&code キーコード …
*<a0.l:2ワード目
load_com_code::
load_code::
moveq.l #M_RULE_NOT_BINDED,d4
tst.b (rule_set)r
beq load_line_err *&ruleが設定されていない
moveq.l #M_TARGET_NOT_BINDED,d4
move.w (target_count)r,d1 *設定するデータ数
beq load_line_err *&targetが設定されていない
lea.l (code_temp)r,a1
subq.w #1,d1
load_code_scan::
moveq.l #M_MISSING_PARAMETER,d4
tst.b (a0)
beq load_line_err *引数が足りない
moveq.l #M_UNDEFINED_NAME,d4
bsr name_search *キーコードを得る
bmi load_line_err
bsr code_to_scan *スキャンコードに変換する
bmi load_line_err
move.b d0,(a1)+ *スキャンコードを書き込む
dbra d1,load_code_scan
moveq.l #M_TOO_MANY_PARAMETERS,d4
tst.b (a0)
bne load_line_err *引数が多すぎる
*キーを押したときと離したときの2回分実行
clr.b (code_mode)r
load_code_mode::
*既に存在するテーブルのルールと一致するか確かめる
lea.l assign_table_work,a1
bra load_code_search
load_code_retry::
move.w (a1),d0
lea.l 2+44(a1,d0.w),a1 *次のテーブル
load_code_search::
bsr rule_search
lea.l -2-44(a1),a1
bne load_code_new *同じルールのテーブルは存在しない
move.b (code_mode)r,d0 *1回目=$00,2回目=$80
move.b 2+44(a1),d1 *テーブルにあるスキャンコード
eor.b d0,d1
bmi load_code_retry *スキャンコードの符号が違う
*テーブルを作り直す
*<a1.l:元のテーブルの先頭
lea.l (assign_table_temp)r,a0 *テーブルの先頭
move.b (target_min)r,d1 *スキャンコードの最小値
or.b (code_mode)r,d1
move.b (target_max)r,d2 *スキャンコードの最小値
or.b (code_mode)r,d2
moveq.l #1,d3 *1データのサイズ
bsr copy_xtbl *テーブルを拡張しながらコピーする
bsr erase_table *テーブルを削除する
moveq.l #0,d3
move.b (assign_table_temp+2+44+2)r,d3 *新しい1データのサイズの最大値
*<d3.w:新しい1データのサイズの最大値
bra load_code_expand
*新しいテーブルを作る
load_code_new::
lea.l (assign_table_temp)r,a0 *テーブルの先頭
lea.l (rule_work)r,a1 *ルールの先頭
move.b (target_min)r,d1 *スキャンコードの最小値
or.b (code_mode)r,d1
move.b (target_max)r,d2 *スキャンコードの最小値
or.b (code_mode)r,d2
moveq.l #1,d3 *1データのサイズ
bsr make_xtbl *新しいコード変換テーブルを作る
*引数をテーブルに書き込む
*<d3.w:新しい1データのサイズの最大値
load_code_expand::
move.l a3,-(sp) *ワークに使うため保護
lea.l (code_temp)r,a0 *&codeの引数の並び
lea.l (assign_table_temp)r,a1 *テーブルの先頭
lea.l (target_work)r,a2 *&targetの引数の並び
move.w (target_count)r,d1 *&targetの引数の個数
subq.w #1,d1 *&targetの引数の個数-1
load_code_loop::
moveq.l #0,d0
move.b (a2)+,d0 *スキャンコード
or.b (code_mode)r,d0
sub.b 2+44(a1),d0 *何番目のデータか
cmp.w #1,d3
beq load_code_not_mul *1データが1バイト
mulu.w d3,d0
load_code_not_mul::
lea.l 2+44+3(a1,d0.w),a3 *書き込む位置
move.b (a0)+,d0 *&codeの引数
or.b (code_mode)r,d0
move.b d0,(a3)+ *1バイト書き込む
move.w d3,d0
subq.w #2,d0
bcs load_code_next *1データが1バイト
load_code_rest::
st.b (a3)+ *残りを$FFで充填する
dbra d0,load_code_rest
load_code_next::
dbra d1,load_code_loop
movea.l (sp)+,a3 *ワークに使ったので復元
*新しいテーブルをテーブルの並びの先頭に追加する
move.w (assign_table_temp)r,d1 *データ部分のサイズ
moveq.l #M_TOO_MANY_CODE,d3
lea.l assign_table_work,a0 *ワークの先頭
lea.l assign_table_work_end-assign_table_work(a0),a2 *ワークの上限
bsr shift_forward *テーブルを後ろにずらす
bmi load_line_err *テーブルの領域が溢れた
lea.l (assign_table_temp)r,a1
bsr duplicate_table *先頭に書き込む
*離したときの分も作る
tas.b (code_mode)r
bpl load_code_mode *$00なら$80にして2回目を実行
bra load_line_loop
********************************
*&ask パッチネーム{=0|[=1]} …
*<a0.l:2ワード目
load_com_ask::
load_ask::
lea.l (load_com_ask_names)r,a1
move.l (ask_flag_bits_work)r,d1
moveq.l #M_MISSING_PARAMETER,d4
moveq.l #0,d0
move.b (a0),d0 *ワードの長さ
beq load_line_err
load_ask_loop::
moveq.l #1,d2 *=1(デフォルト)
lea.l 1(a0,d0.w),a2 *次の引数の位置
cmpi.b #'=',-2(a2)
bne load_ask_no_equal
cmpi.b #'1',-1(a2)
beq load_ask_one *=1
cmpi.b #'0',-1(a2)
bne load_ask_no_equal *{=0|=1}がない
moveq.l #0,d2 *=0
load_ask_one::
subq.b #2,(a0) *2文字短くする
load_ask_no_equal::
moveq.l #M_UNKNOWN_PACH_NAME,d4
bsr word_search *パッチネームを番号に変換
bmi load_line_err
bset.l d0,d1 *対応するビットをセット
tst.l d2
bne load_ask_next
bclr.l d0,d1 *対応するビットをリセット
load_ask_next::
movea.l a2,a0 *次の位置
moveq.l #0,d0
move.b (a0),d0 *ワードの長さ
bne load_ask_loop *まだ引数がある
move.l d1,(ask_flag_bits_work)r *フラグに設定
bra load_line_loop
*パッチネームリスト
load_com_ask_names::
* 文字数,文字列,番号
.dc.b 4,'auto',5
.dc.b 3,'ins',7
.dc.b 3,'led',6
.dc.b 4,'lock',1
.dc.b 3,'n-n',8
.dc.b 5,'space',3
.dc.b 3,'tsu',2
.dc.b 5,'tsu-n',9
.dc.b 3,'xf1',11
.dc.b 7,'zenkaku',4
.dc.b 0
.even
********************************
*&click
*<a0.l:2ワード目
load_com_click::
bra load_line_loop
********************************
*&full
*<a0.l:2ワード目
load_com_full::
bra load_line_loop
********************************
*&hide
*<a0.l:2ワード目
load_com_hide::
bra load_line_loop
********************************
*&meta [スキャンコード]{メタ文字} ルール
*<a0.l:2ワード目
load_com_meta::
moveq.l #M_MISSING_PARAMETER,d4
move.b (a0)+,d0 *メタ文字のバイト数
beq load_line_err
moveq.l #M_ILLEGAL_META_CHAR,d4
moveq.l #0,d2 *メタ文字の上位バイトをクリア
subq.b #1,d0
beq load_com_meta_1 *スキャンコードが省略された
subq.b #1,d0
bne load_line_err
move.b (a0)+,d2 *スキャンコードの指定
lsl.w #8,d2
load_com_meta_1::
move.b (a0)+,d2 *メタ文字の指定
lea.l (rule_temp)r,a1 *ルールのビット展開領域
bsr load_rule *ルールを読み取る
bmi load_line_err
lea.l meta_table_work,a0 *テーブルのワーク
bsr temp_search *ルールが同じテーブルを探す
bne load_com_meta_new *同じテーブルがない
move.w d2,2+44(a0) *メタ文字を上書きする
bra load_line_loop
*ルールが違うので別に登録する
*<d2.w:メタコード
load_com_meta_new::
lea.l meta_table_work,a0 *テーブルのワーク
lea.l meta_table_work_end-meta_table_work(a0),a2
bsr get_table_size
move.w d0,d1
add.w d1,d1
lea.l 2(a0,d1.w),a0 *エンドコードの次のアドレス
lea.l 2+44+2(a0),a1
moveq.l #M_TOO_MANY_META,d4
cmpa.l a2,a1
bhi load_line_err *テーブルが溢れた
load_com_meta_shift::
move.w -(a0),-(a1) *登録済みのテーブルを後ろにずらす
dbra d0,load_com_meta_shift
move.w #2,(a0)+ *定数
lea.l (rule_temp)r,a1
moveq.l #44/4-1,d0
@@: move.l (a1)+,(a0)+ *ルールを設定
dbra d0,@b
move.w d2,(a0)+ *メタコード
bra load_line_loop
********************************
*&prog ファイル名 …
*<a0.l:2ワード目
load_com_prog::
moveq.l #M_MISSING_PARAMETER,d4
tst.b (a0)
beq load_line_err *引数が足りない
load_com_prog_loop::
bsr search_prog *プログラムの番号を得る
bmi load_line_err
tst.b (a1)
bne load_com_prog_next *既に登録されているので次のファイル名へ
moveq.l #M_TOO_MANY_PROGRAMS,d4
cmp.w #31,d0
beq load_line_err *プログラム登録が多すぎる
movem.l (prog_table_temp)r,d0-d4/a2
movem.l d0-d4/a2,(a1) *ファイル名を登録する
clr.w 24(a1) *次のエンドコード
load_com_prog_next::
tst.b (a0) *次の文字数
bne load_com_prog_loop *次のファイル名へ
bra load_line_loop
********************************
*ファイルエンド
load_eof::
*クローズ
move.w d7,-(sp)
DOS _CLOSE
addq.w #2,sp
*エラーがなければ次のファイルへ
tst.w d5 *エラーカウンタ
bne load_eof_err *エラーがあった
movea.l (next_name_ptr)r,a2 *次の環境定義ファイル名のアドレス
tst.b (a2)
bne load_file_loop *次のファイルへ
*テーブルのアドレスを設定する
lea.l prefix_table_work,a0
move.l a0,(prefix_table)r
lea.l assign_table_work,a0
move.l a0,(assign_table)r
lea.l suffix_table_work,a0
move.l a0,(suffix_table)r
lea.l char_table_work,a0
move.l a0,(char_table)r
lea.l meta_table_work,a0
move.l a0,(meta_table)r
lea.l (prog_table_work)r,a0
move.l a0,(prog_table)r
lea.l break_table_work,a0
move.l a0,(break_table)r
lea.l copy_table_work,a0
move.l a0,(copy_table)r
lea.l den_table_work,a0
move.l a0,(den_table)r
lea.l int_table_work,a0
move.l a0,(int_table)r
lea.l lock_table_work,a0
move.l a0,(lock_table)r
lea.l reset_table_work,a0
move.l a0,(reset_table)r
lea.l sbreak_table_work,a0
move.l a0,(sbreak_table)r
lea.l unlock_table_work,a0
move.l a0,(unlock_table)r
*環境定義ファイルの読み込み終わり
moveq.l #0,d4 *エラーなし
rts
*エラーがあった
load_eof_err::
moveq.l #M_ENVIRONMENT_ERROR,d4
rts
********************************
*エラーメッセージ表示
*<d4.w:メッセージの番号
*<d5.w:エラーカウンタ
*<d6.w:次の行の行番号
*>d5.w:エラーカウンタ
*?d0/a0
load_line_err::
subq.w #1,d6 *行番号を修正する
bsr write_line_message
addq.w #1,d6 *行番号を元に戻す
*次の行へ
bra load_line_loop
*オープンできない
load_opn_err::
*<a3.l:ファイル名のアドレス
movea.l a3,a0
bsr write_string
moveq.l #M_CANNOT_OPEN,d4
rts
********************************
*ルールを読み取る
* ルールのフォーマットは、{キーコード|キーネーム}{=0|[=1]} …。
*<a0.l:2ワード目
*<a1.l:ビット展開領域のアドレス
*>d4.l:エラーなし=0/あり=メッセージの番号
*z:エラーあり=0/なし=1
*?d4
load_rule::
movem.l d0-d3/a0-a3,-(sp)
movea.l a1,a3
moveq.l #0,d0
.rept 44/4
move.l d0,(a1)+
.endm
bra load_rule_cont
load_rule_loop::
moveq.l #0,d1
moveq.l #0,d2
subq.w #2,d0
ble load_rule_one *=0または=1がない
cmpi.b #'=',1(a0,d0.w)
bne load_rule_one *=がない
moveq.l #-'1',d3
add.b 1+1(a0,d0.w),d3
beq load_rule_one_on *=1
addq.b #'1'-'0',d3
bne load_rule_one *=0または=1がない
moveq.l #18+4,d2 *=0の場合のオフセット
load_rule_one_on::
move.b d0,(a0) *2文字短くする
moveq.l #2,d1
load_rule_one::
movea.l a0,a2
bsr name_search
bmi load_rule_undef_key *未定義のキーネーム
adda.w d1,a0 *=0または=1の分を補正する
move.w d0,d3
lsr.w #3,d3
add.w d2,d3 *=0の場合はアドレスに18+4加える
bset.b d0,(a3,d3.w)
bra load_rule_cont
load_rule_undef_key::
movea.l a2,a0
bsr search_prog
bmi load_rule_failed *未定義のプログラム
tst.b (a1)
beq load_rule_failed *未定義のプログラム
adda.w d1,a0 *=0または=1の分を補正する
moveq.l #0,d3
bset.l d0,d3 *該当するビットを立てる
or.l d3,18(a3,d2.w) *=0の場合はアドレスに18+4加える
load_rule_cont::
moveq.l #0,d4
moveq.l #0,d0
move.b (a0),d0
bne load_rule_loop
load_rule_end::
movem.l (sp)+,d0-d3/a0-a3
tst.l d4
rts
load_rule_failed::
moveq.l #M_UNDEFINED_NAME,d4
bra load_rule_end
********************************
*キーネームをキーコードに変換する
* 見つからないとき 16 進数 2 桁として認識できればその値を返します。
*<a0.l:ワードのアドレス(長さ,文字列)
*>d0.l:番号(見つかった>=0/見つからない<0)
*>a0.l:ワードの次のアドレス(見つからなければ不定)
*>n:見つかった=0/見つからない=1
*?d0/a0
name_search::
move.l a1,-(sp)
lea.l (name_work)r,a1
cmpi.b #2,(a0)
beq name_search_two *2文字ならば16進数もチェック
bsr word_search
movea.l (sp)+,a1
rts
name_search_two::
bsr word_search
bpl name_search_end *キーネームが見つかった
bsr chrhex2 *16進数に変換してみる
ext.l d0
bmi name_search_end *16進数でもない
cmp.b #$90,d0
blo name_search_end *$00~$8F
moveq.l #-1,d0 *$90~$FF
name_search_end::
tst.l d0
movea.l (sp)+,a1
rts
********************************
*キーコードをスキャンコードに変換する
* キーコードが$80~$86,$88~$8B,$8Fならば$5A~$60,$70~$74に変換します。
*<d0.b:キーコード
*>d0.l:スキャンコード
*>n:エラーあり=1,エラーなし=0
*?d0
code_to_scan::
ext.w d0
bpl code_to_scan_end
sub.w #$FF80,d0
cmp.w #$008F-$0080,d0
bhi code_to_scan_err
move.b code_to_scan_tbl(pc,d0.w),d0
ext.w d0
code_to_scan_end::
ext.l d0
rts
code_to_scan_err::
moveq.l #-1,d0
rts
code_to_scan_tbl::
.dc.b $5A,$5B,$5C,$5D,$5E,$5F,$60,$FF
.dc.b $70,$71,$72,$73,$FF,$FF,$FF,$74
********************************
*ワードの番号を求める
*<a0.l:ワードのアドレス(長さ,文字列)
*<a1.l:辞書のアドレス(長さ,文字列,番号,…,0)
*>d0.l:番号(見つかった>=0/見つからない<0)
*>a0.l:ワードの次のアドレス(見つからなければ文字列の先頭アドレス)
*>n:見つかった=0/見つからない=1
*?d0/a0
word_search::
movem.l d1-d2/a1-a3,-(sp)
moveq.l #0,d0
moveq.l #0,d1
move.b (a0)+,d0 *ワードの長さ
move.b (a1)+,d1
word_search_loop::
cmp.b d0,d1
bne word_search_next *長さが一致しない
movea.l a0,a2
movea.l a1,a3
move.w d0,d2
subq.w #1,d2
word_search_cmp::
cmpm.b (a2)+,(a3)+ *比較
dbne d2,word_search_cmp
beq word_search_fnd *見つかった
*次のワードへ
word_search_next::
lea.l 1(a1,d1.w),a1
move.b (a1)+,d1
bne word_search_loop *次のワードへ
*見つからない
word_search_not::
moveq.l #-1,d0
bra word_search_end
*見つかった
word_search_fnd::
move.b (a3),d0 *番号
movea.l a2,a0 *ワードの直後
tst.l d0
word_search_end::
movem.l (sp)+,d1-d2/a1-a3
rts
********************************
*&ruleと同じルールのテーブルが既に存在するか調べる
*<a1.l:テーブルの並びの先頭アドレス
*>a1.l:見つかった=データ部分の先頭アドレス/見つからなかった=不定
*>z:見つかった=1/見つからなかった=0
*?d0
rule_search::
movem.l d1/a0/a2,-(sp)
bra rule_search_start
rule_search_loop::
lea.l 44(a2,d0.w),a1 *次のテーブルへ
rule_search_start::
move.w (a1)+,d0 *データサイズ
bmi rule_search_failed *見つからなかった
lea.l (rule_work)r,a0 *&ruleの設定
movea.l a1,a2
.rept 44/4
cmpm.l (a0)+,(a1)+ *ルールを比較する
bne rule_search_loop
.endm
movem.l (sp)+,d1/a0/a2
rts
rule_search_failed::
moveq.l #1,d0 *見つからなかった
movem.l (sp)+,d1/a0/a2
rts
********************************
*ルールが同じテーブルを探す
*<a0.l:テーブルのワーク
*<a1.l:ルール
*>a0.l:見つかった=テーブルの先頭/見つからなかった=不定
*>z:見つかった=1/見つからなかった=0
*?d0/a0
temp_search::
movem.l a1-a3,-(sp)
bra temp_search_start
temp_search_loop::
lea.l 2+44(a0,d0.w),a0 *次のテーブルへ
temp_search_start::
move.w (a0),d0 *サイズ
bmi temp_search_end *見つからなかった
lea.l 2(a0),a2 *ルール
movea.l a1,a3
.rept 44/4
cmpm.l (a2)+,(a3)+ *ルールを比較する
bne temp_search_loop
.endm
temp_search_end::
movem.l (sp)+,a1-a3
rts
********************************
*プログラムの条件が同じテーブルを探す
*<a0.l:テーブルのワーク
*<a1.l:ルール
*>a0.l:見つかった=テーブルの先頭/見つからなかった=不定
*>z:見つかった=1/見つからなかった=0
*?d0/a0
rule_prog_search_loop::
move.w (a0),d0
lea.l 2+44(a0,d0.w),a0 *次のテーブルへ
rule_prog_search::
tst.w (a0) *サイズ
bmi rule_prog_search_end *見つからなかった
move.l 2+18(a0),d0
cmp.l 18(a1),d0
bne rule_prog_search_loop *一致しない
move.l 2+18+4+18(a0),d0
cmp.l 18+4+18(a1),d0
bne rule_prog_search_loop *一致しない
rule_prog_search_end::
rts
********************************
*プログラムの番号を得る
* 文字列を 24 バイト詰めにした結果は prog_table_temp に残る。
*<a0.l:文字数のアドレス(文字数>0)
*<a1.l:ファイル名のテーブル
*>d0.l:プログラムの番号(31なら追加できない)
*>d4.l:エラーコード
*>a0.l:次の文字列のアドレス
*>a1.l:見つかった=見つかった位置/見つからなかった=次の空きのアドレス
*n:エラーあり=1/エラーなし=0
*?d0/d3-d4/a0-a2
search_prog::
moveq.l #0,d0
move.b (a0)+,d0
moveq.l #M_TOO_LONG_FILE_NAME,d4
cmp.w #23,d0
bhi search_prog_end *ファイル名が長すぎる
moveq.l #0,d4 *エラーコード
lea.l (prog_table_temp)r,a1
.rept 24/4
move.l d4,(a1)+ *ファイル名を小文字化するワーク
.endm
movem.l d1-d2/a3-a4,-(sp)
lea.l (a0,d0.w),a4 *次の文字数のアドレス
move.b (a4),d1
clr.b (a4) *一時的なエンドコード
lea.l (prog_table_temp)r,a1
bsr to_lower *小文字化する
move.b d1,(a4)
lea.l (prog_table_temp)r,a0 *文字列
lea.l (prog_table_work)r,a1 *ファイル名のテーブル
moveq.l #0,d0 *プログラムの番号
move.w (a0)+,d1 *先頭2バイト
move.w (a1)+,d2 *最初のファイル名の先頭2バイト
beq search_prog_undef *プログラムが定義されていない
search_prog_loop::
cmp.w d1,d2 *先頭2バイトを比較
bne search_prog_next *一致しないので次のファイル名へ
movea.l a0,a2 *探すファイル名の先頭+2
movea.l a1,a3 *定義されたファイル名の先頭+2
.rept (24-2-2)/4
cmpm.l (a2)+,(a3)+ *残りは4バイトずつ比較
bne search_prog_next *一致しないので次のファイル名へ
.endm
cmpm.w (a2)+,(a3)+ *最後の2バイトを比較
beq search_prog_found *見つかった
search_prog_next::
lea.l 24-2(a1),a1 *次のファイル名
addq.w #1,d0 *次のプログラムの番号
move.w (a1)+,d2 *次のファイル名の先頭2バイト
bne search_prog_loop *次のファイルへ
search_prog_undef::
search_prog_found::
subq.w #2,a1 *ファイル名の先頭
movea.l a4,a0 *次の文字数のアドレス
movem.l (sp)+,d1-d2/a3-a4
search_prog_end::
tst.l d4
rts
********************************
*デフォルトの環境定義ファイル名
* 起動したプログラムと同じパスが付加されます。
* デフォルトの環境定義ファイル名は 1 つだけですが、エンドコードが必要です。
default_env_name::
.dc.b 'KeyWitch.env',0
.dc.b 0 *環境定義ファイル名の並びの終わり
********************************
*環境定義ファイルを検索するパスを指定する環境変数名
env_var_name::
.dc.b 'KEYWITCH',0
.even
.bss
.even
********************************
*ワークエリア
env_name_work::
.ds.b 256 *環境定義ファイル名
next_name_ptr::
.ds.l 1 *次の環境定義ファイル名のアドレス
rdc_work::
.ds.w 2
.ds.b 1024+2 *ファイル読み込みバッファ
rds_work::
.ds.b 1024 *1行読み込みワーク
rule_set::
.ds.b 1 *&ruleが設定された=-1
.even
ask_flag_bits_work::
.ds.l 1 *&askのワーク
rule_work::
.ds.b 44 *&ruleのワーク
rule_temp::
.ds.b 44 *ルールのワーク
assign_temp::
.ds.b 32 *&assign,&prefix,&suffixの引数のワーク
target_count::
.ds.w 1 *&targetの長さ
target_work::
.ds.b 128 *&targetのワーク
target_mark::
.ds.w 128/2 *&targetの二重定義チェックフラグ
target_min::
.ds.b 1 *&targetの最小値
target_max::
.ds.b 1 *&targetの最大値
last_name_tail::
.ds.l 1 *キーネームの並びの末尾
name_work::
.ds.b 1024 *キーネームのワーク
name_work_tail::
*
prog_table_work::
.ds.b 24*31+2
prog_table_work_end::
live_repeat_bits_work::
.ds.b 16
kill_repeat_bits_work::
.ds.b 16
led_map_work::
.ds.b 7
joy1_map_work::
.ds.b 8
joy2_map_work::
.ds.b 8
*
code_mode::
.ds.b 1 *&code用ワーク,1回目=$00,2回目=$80
.even
*各種テーブル一時展開領域
char_table_temp::
prefix_table_temp::
assign_table_temp::
suffix_table_temp::
.ds.b 2+44+3+32*128+1
code_temp::
.ds.b 128
prog_table_temp::
.ds.b 24
*以降は絶対番地でアクセスする
*各種テーブル展開領域
char_table_work::
.ds.b (2+44+3+128+1)*32+2
char_table_work_end::
prefix_table_work::
.ds.b (2+44+3+128+1)*16+2
prefix_table_work_end::
assign_table_work::
.ds.b (2+44+3+128+1)*16+2
assign_table_work_end::
suffix_table_work::
.ds.b (2+44+3+128+1)*16+2
suffix_table_work_end::
meta_table_work::
.ds.b (2+44+2)*32+2
meta_table_work_end::
break_table_work::
.ds.b (2+44)*32+2
break_table_work_end::
copy_table_work::
.ds.b (2+44)*32+2
copy_table_work_end::
den_table_work::
.ds.b (2+44)*32+2
den_table_work_end::
int_table_work::
.ds.b (2+44)*32+2
int_table_work_end::
lock_table_work::
.ds.b (2+44)*32+2
lock_table_work_end::
reset_table_work::
.ds.b (2+44)*32+2
reset_table_work_end::
sbreak_table_work::
.ds.b (2+44)*32+2
sbreak_table_work_end::
unlock_table_work::
.ds.b (2+44)*32+2
unlock_table_work_end::